home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 2.iso / dist / fw_common.idb / usr / freeware / bin / gen-dir-node.z / gen-dir-node
Text File  |  2002-10-07  |  7KB  |  243 lines

  1. #!/bin/sh
  2. # $Id: gen-dir-node,v 1.3 1998/06/19 15:44:31 drk Exp $
  3. # Generate the top-level Info node, given a directory of Info files
  4. # and (optionally) a skeleton file.  The output will be suitable for a
  5. # top-level dir file.  The skeleton file contains info topic names in the
  6. # order they should appear in the output.  There are three special
  7. # lines that alter the behavior: a line consisting of just "--" causes
  8. # the next line to be echoed verbatim to the output.  A line
  9. # containing just "%%" causes all the remaining filenames (wildcards
  10. # allowed) in the rest of the file to be ignored.  A line containing
  11. # just "!!" exits the script when reached (unless preceded by a line
  12. # containing just "--").  Once the script reaches the end of the
  13. # skeleton file, it goes through the remaining files in the directory
  14. # in order, putting their entries at the end.  The script will use the
  15. # ENTRY information in each info file if it exists.  Otherwise it will
  16. # make a minimal entry.
  17.  
  18. # sent by Jeffrey Osier <jeffrey@cygnus.com>, who thinks it came from
  19. # zoo@winternet.com (david d `zoo' zuhn)
  20.  
  21. # modified 7 April 1995 by Joe Harrington <jh@tecate.gsfc.nasa.gov> to
  22. # take special flags
  23.  
  24. INFODIR=$1
  25. if [ $# = 2 ] ; then
  26.   SKELETON=$2
  27. else
  28.   SKELETON=/dev/null
  29. fi
  30.  
  31. skip=
  32.  
  33. if [ $# -gt 2 ] ; then
  34.   echo usage: $0 info-directory [ skeleton-file ] 1>&2
  35.   exit 1
  36. elif [ -z "${INFODIR}" ] ; then
  37.   INFODIR="%%DEFAULT_INFO_DIR%%"
  38. else
  39.   true
  40. fi
  41.  
  42. if [ ! -d ${INFODIR} ] ; then
  43.   echo "$0: first argument must specify a directory"
  44.   exit 1
  45. fi
  46.  
  47. ### output the dir header
  48. echo "-*- Text -*-"
  49. echo "This file was generated automatically by $0."
  50. echo "This version was generated on `date`"
  51. echo "by `whoami`@`hostname` for `(cd ${INFODIR}; pwd)`"
  52.  
  53. cat << moobler
  54. \$Id: gen-dir-node,v 1.3 1998/06/19 15:44:31 drk Exp $
  55. This is the file .../info/dir, which contains the topmost node of the
  56. Info hierarchy.  The first time you invoke Info you start off
  57. looking at that node, which is (dir)Top.
  58. 
  59. File: dir    Node: Top    This is the top of the INFO tree
  60.  
  61.   This (the Directory node) gives a menu of major topics. 
  62.   Typing "q" exits, "?" lists all Info commands, "d" returns here,
  63.   "h" gives a primer for first-timers,
  64.   "mEmacs<Return>" visits the Emacs topic, etc.
  65.  
  66.   In Emacs, you can click mouse button 2 on a menu item or cross reference
  67.   to select it.
  68.  
  69. * Menu: The list of major topics begins on the next line.
  70.  
  71. moobler
  72.  
  73. ### go through the list of files in the skeleton.  If an info file
  74. ### exists, grab the ENTRY information from it.  If an entry exists
  75. ### use it, otherwise create a minimal dir entry.
  76. ###
  77. ### Then remove that file from the list of existing files.  If any
  78. ### additional files remain (ones that don't have a skeleton entry), 
  79. ### then generate entries for those in the same way, putting the info for 
  80. ### those at the end....
  81.  
  82. infofiles=`(cd ${INFODIR}; /bin/ls | grep -v '\-[0-9]*$' | grep -v '\-[0-9]*.gz$' | egrep -v '^dir$|^dir\.info$|^dir\.orig$')`
  83.  
  84. # echoing gets clobbered by backquotes; we do it the hard way...
  85. lines=`wc $SKELETON | awk '{print $1}'`
  86. line=1
  87. while [ $lines -ge $line ] ; do
  88.   # Read one line from the file.  This is so that we can echo lines with
  89.   # whitespace and quoted characters in them.
  90.   fileline=`awk NR==$line $SKELETON`
  91.  
  92.   # flag fancy features
  93.   if [ ! -z "$echoline" ] ; then    # echo line
  94.     echo "$fileline"
  95.     fileline=
  96.     echoline=
  97.   elif [ "${fileline}" = "--" ] ; then    # should we echo the next line?
  98.     echoline=1
  99.   elif [ "${fileline}" = "%%" ] ; then    # eliminate remaining files from dir?
  100.     skip=1
  101.   elif [ "${fileline}" = "!!" ] ; then    # quit now
  102.     exit 0
  103.   fi
  104.  
  105.   # handle files if they exist
  106.   for file in $fileline"" ; do    # expand wildcards ("" handles blank lines)
  107.  
  108.     fname=
  109.  
  110.     if [ -z "$echoline" -a ! -z "$file" ] ; then
  111.  
  112.       # Find the file to operate upon.  Check both possible names.
  113.       infoname=`echo $file | sed 's/\.info$//'`
  114.       noext=
  115.       ext=
  116.       if [ -f ${INFODIR}/$infoname ] ; then
  117.         noext=$infoname
  118.       fi
  119.       if [ -f ${INFODIR}/${infoname}.info ] ; then
  120.         ext=${infoname}.info
  121.       fi
  122.  
  123.       # If it exists with both names take what was said in the file.
  124.       if [ ! -z "$ext" -a ! -z "$noext" ]; then
  125.         fname=$file
  126.         warn="### Warning: $ext and $noext both exist!  Using ${file}. ###"
  127.       elif [ ! \( -z "$ext" -a -z "$noext" \) ]; then
  128.         # just take the name if it exists only once
  129.         fname=${noext}${ext}
  130.       fi
  131.  
  132.       # if we found something and aren't skipping, do the entry
  133.       if [ ! -z "$fname" ] ; then
  134.         if [ -z "$skip" ] ; then
  135.  
  136.           if [ ! -z "$warn" ] ; then    # issue any warning
  137.         echo $warn
  138.         warn=
  139.           fi
  140.  
  141.           entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \
  142.              -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/$fname`
  143.           if [ ! -z "${entry}" ] ; then
  144.             echo "${entry}"
  145.           else
  146.             echo "* ${infoname}: (${infoname})."
  147.           fi
  148.         fi
  149.  
  150.         # remove the name from the directory listing
  151.     infofiles=`echo "" ${infofiles} "" | sed -e "s/ ${fname} / /" -e "s/  / /g"`
  152.  
  153.       fi
  154.  
  155.     fi
  156.  
  157.   done
  158.  
  159.   line=`expr $line + 1`
  160. done
  161.  
  162. if [ -z "${infofiles}" ] ; then
  163.   exit 0
  164. elif [ $lines -gt 0 ]; then
  165.   echo
  166. fi
  167.  
  168. # Sort remaining files by INFO-DIR-SECTION.
  169. tmpfile=/tmp/gen-dir-node.$$
  170. touch ${tmpfile}
  171. for file in ${infofiles}; do
  172.   case $file in
  173.     *.gz) zcat=gzcat; file=`echo $file|sed 's/\.gz$//'`; gz=.gz;;
  174.     *) zcat=cat; gz=;;
  175.   esac
  176.   if [ -d "${INFODIR}/${file}" ]; then continue; fi
  177.   section=`$zcat ${INFODIR}/${file}${gz} | fgrep INFO-DIR-SECTION | \
  178.        fgrep -v 'INFO-DIR-SECTION Miscellaneous'`
  179.   if [ ! -z "${section}" ]; then
  180.     echo ${file}${gz}:${section} >> ${tmpfile}
  181.   fi
  182. done
  183.  
  184. filesectdata=`sort -t : -k 2 -k 1 ${tmpfile} | tr ' ' '_'`
  185. rm -f ${tmpfile}
  186.  
  187. prevsect=
  188. for sectdata in ${filesectdata}; do
  189.   file=`echo ${sectdata} | cut -d: -f1`
  190.   if [ -d "${INFODIR}/${file}" ]; then continue; fi
  191.   case $file in
  192.     *.gz) zcat=gzcat; file=`echo $file|sed 's/\.gz$//'`; gz=.gz;;
  193.     *) zcat=cat; gz=;;
  194.   esac
  195.  
  196.   section=`$zcat ${INFODIR}/${file}${gz} | sed -n -e 's/^INFO-DIR-SECTION //p'`
  197.   infofiles=`echo "" ${infofiles} "" | sed -e "s/ ${file}${gz} / /" -e "s/  / /g"`
  198.  
  199.   if [ "${prevsect}" != "${section}" ] ; then
  200.     if [ ! -z "${prevsect}" ] ; then
  201.       echo ""
  202.     fi
  203.     echo "${section}"
  204.     prevsect="${section}"
  205.   fi
  206.  
  207.   infoname=`echo $file | sed 's/\.info$//'`
  208.   entry=`$zcat ${INFODIR}/${file}${gz} \
  209.            |sed -e '1,/START-INFO-DIR-ENTRY/d' \
  210.         -e '/END-INFO-DIR-ENTRY/,$d'`
  211.  
  212.   if [ ! -z "${entry}" ] ; then
  213.     echo "${entry}"
  214.   else
  215.     echo "* ${infoname}: (${infoname})."
  216.   fi
  217. done
  218.  
  219. # Process miscellaneous files.
  220. for file in ${infofiles}; do
  221.   if [ -d "${INFODIR}/${file}" ]; then continue; fi
  222.   if [ ! -z "${prevsect}" ] ; then
  223.     echo ""
  224.     echo "Miscellaneous"
  225.     prevsect=""
  226.   fi
  227.  
  228.   case $file in
  229.     *.gz) zcat=gzcat; file=`echo $file|sed 's/\.gz$//'`; gz=.gz;;
  230.     *) zcat=cat; gz=;;
  231.   esac
  232.   infoname=`echo $file | sed 's/\.info$//'`
  233.   entry=`$zcat ${INFODIR}/${file}${gz} \
  234.            |sed -e '1,/START-INFO-DIR-ENTRY/d' \
  235.         -e '/END-INFO-DIR-ENTRY/,$d'`
  236.  
  237.   if [ ! -z "${entry}" ] ; then
  238.     echo "${entry}"
  239.   else
  240.     echo "* ${infoname}: (${infoname})."
  241.   fi
  242. done
  243.